import { Component } from 'react';
import { shallowEqualImmutable } from 'react-immutable-render-mixin';
import PropTypes from 'prop-types';

/**
 * 项目中的component除纯函数化组建外，都应该继承该类。
 * @class BaseComponent
 * @extends React.Component
 * @memberOf fe-lib
 */
export default class BaseComponent extends Component {

  /**
   * 基于immutable判断，覆写shouldComponentUpdate方法
   * @function shouldComponentUpdate
   * @memberof BaseComponent
   * @instance
   * @param nextProps -- 最新props数据
   * @param nextState -- 最新state数据
   * @returns {boolean} -- 组建是否需要更新
   */
  shouldComponentUpdate(nextProps, nextState) {
    return !shallowEqualImmutable(this.props, nextProps)
      || !shallowEqualImmutable(this.state, nextState);
  }

  /**
   * 帮助组建中的函数绑定this（组建实例对象）
   * @function bind
   * @memberof BaseComponent
   * @instance
   * @param methods -- 需要绑定this的函数名数组
   * @example bind('func1', 'func2');
   */
  bind(...methods) {
    methods.map((method) => {
      if (this[method]) {
        (this[method] = this[method].bind(this));
      } else {
        console.warn(`不存在的bind:[${method}]`);
      }
    });
  }
}

BaseComponent.contextTypes = {
  router: PropTypes.object.isRequired
};
